#ifndef PLANSERVICE_H
#define PLANSERVICE_H

#include <QObject>
#include <QTimer>
#include "plan/PlanTask.h"
#include "plan/PlanStorage.h"
#include "service_global.h"

/**
 * @brief 日计划服务类
 * 负责任务的增删改查、提醒检查、状态管理等业务逻辑
 */
class SERVICE_EXPORT PlanService : public QObject
{
    Q_OBJECT
    
public:
    /**
     * @brief 获取单例实例
     */
    static PlanService& instance();
    
    // ========== 任务CRUD操作 ==========
    
    /**
     * @brief 创建新任务
     * @param title 任务标题
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 新创建的任务
     */
    PlanTask createTask(const QString& title, const QDateTime& startTime, const QDateTime& endTime);
    
    /**
     * @brief 更新任务
     * @param task 任务对象
     * @return 是否成功
     */
    bool updateTask(const PlanTask& task);
    
    /**
     * @brief 删除任务
     * @param taskId 任务ID
     * @param date 任务所属日期
     * @return 是否成功
     */
    bool deleteTask(const QString& taskId, const QDate& date);
    
    /**
     * @brief 获取指定日期的所有任务
     * @param date 日期
     * @return 任务列表（按sortOrder排序）
     */
    QList<PlanTask> getTasks(const QDate& date);
    
    /**
     * @brief 获取本周的所有任务
     * @return 任务列表
     */
    QList<PlanTask> getWeekTasks();
    
    /**
     * @brief 获取指定日期范围的任务
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 任务列表
     */
    QList<PlanTask> getTasksInRange(const QDate& startDate, const QDate& endDate);
    
    // ========== 任务状态管理 ==========
    
    /**
     * @brief 切换任务完成状态
     * @param taskId 任务ID
     * @param date 任务所属日期
     * @return 是否成功
     */
    bool toggleTaskStatus(const QString& taskId, const QDate& date);
    
    /**
     * @brief 标记任务为已完成
     * @param taskId 任务ID
     * @param date 任务所属日期
     * @return 是否成功
     */
    bool markTaskCompleted(const QString& taskId, const QDate& date);
    
    // ========== 任务排序 ==========
    
    /**
     * @brief 更新任务的排序顺序
     * @param date 日期
     * @param taskIds 任务ID列表（按新顺序）
     * @return 是否成功
     */
    bool reorderTasks(const QDate& date, const QStringList& taskIds);
    
    // ========== 提醒检查 ==========
    
    /**
     * @brief 启动提醒检查定时器
     */
    void startReminderCheck();
    
    /**
     * @brief 停止提醒检查定时器
     */
    void stopReminderCheck();

    /**
     * @brief 稍后提醒（顺延提醒时间）
     * @param taskId 任务ID
     * @param date 任务所属日期（用于定位与刷新）
     * @param minutes 顺延分钟数（例如 5/10/15）
     * @return 是否成功
     */
    bool snoozeTask(const QString& taskId, const QDate& date, int minutes);

    // ========== 导出/导入 ==========
    bool exportTasksToJson(const QDate& startDate, const QDate& endDate, const QString& filePath);
    bool exportTasksToCsv(const QDate& startDate, const QDate& endDate, const QString& filePath);
    bool importTasksFromJson(const QString& filePath);
    bool importTasksFromCsv(const QString& filePath);
    
signals:
    /**
     * @brief 任务列表已更新
     * @param date 更新的日期
     */
    void tasksUpdated(const QDate& date);
    
    /**
     * @brief 任务已创建
     * @param task 新创建的任务
     */
    void taskCreated(const PlanTask& task);
    
    /**
     * @brief 任务已更新
     * @param task 更新后的任务
     */
    void taskUpdated(const PlanTask& task);
    
    /**
     * @brief 任务已删除
     * @param taskId 删除的任务ID
     * @param date 任务所属日期
     */
    void taskDeleted(const QString& taskId, const QDate& date);
    
    /**
     * @brief 任务提醒触发
     * @param task 需要提醒的任务
     */
    void taskReminderTriggered(const PlanTask& task);
    
    /**
     * @brief 任务完成
     * @param task 完成的任务
     */
    void taskCompleted(const PlanTask& task);
    
private:
    explicit PlanService(QObject *parent = nullptr);
    ~PlanService();
    
    PlanService(const PlanService&) = delete;
    PlanService& operator=(const PlanService&) = delete;
    
    /**
     * @brief 检查所有任务的提醒
     */
    void checkReminders();
    
    /**
     * @brief 查找指定任务
     * @param taskId 任务ID
     * @param date 任务所属日期
     * @return 任务对象（如果不存在则返回无效任务）
     */
    PlanTask findTask(const QString& taskId, const QDate& date);
    void clearReminderFlag(const QString& taskId) { m_remindedTasks.remove(taskId); }
    
private:
    PlanStorage m_storage;              // 存储管理器
    QTimer* m_reminderTimer;            // 提醒检查定时器
    QSet<QString> m_remindedTasks;      // 已提醒的任务集合（避免重复提醒）
};

#endif // PLANSERVICE_H

